/*
 * GerenciadorArquivos.c
 *
 *  Created on: 04/07/2011
 *      Author: Hyzandey
 */

#include "GerenciadorArquivos.h"

char *recuperaBufferArquivo(FILE *ponteiroArquivo, const int offset,
		const int quantidadeCaracteres) {

	char *buffer = (char *) calloc(sizeof(char), quantidadeCaracteres);

	if (!buffer){
		return NULL;
	}

	int naofuncionou = fseek(ponteiroArquivo,offset,SEEK_SET);

	if (naofuncionou){
		liberaPonteiro(buffer);
		return NULL;
	}

	int elementosLidos = fread(buffer, sizeof(char), quantidadeCaracteres, ponteiroArquivo);

	if (elementosLidos != quantidadeCaracteres){
		liberaPonteiro(buffer);
		return NULL;
	}

	return buffer;

}

int gravaBufferArquivo(const FILE *ponteiroArquivo, const char *nomeArquivo) {
	return EXIT_FAILURE;
}

FILE *abreArquivoGravacao(const char *nomeArquivo) {
	FILE *arquivo = fopen(nomeArquivo, "ab");
	if (!arquivo) {
		arquivo = fopen(nomeArquivo, "wb");
	}
	setvbuf(arquivo, NULL, _IONBF, 0);
	return arquivo;
}

FILE *abreArquivoLeitura(const char *nomeArquivo) {
	FILE *arquivo = fopen(nomeArquivo, "rb");
	if (!arquivo) {
		return NULL;
	}
	setvbuf(arquivo, NULL, _IONBF, 0);
	return arquivo;
}

long medeTamanhoArquivo(FILE *arquivo) {
	int erro = 1;

	erro = fseek(arquivo, 0, SEEK_END);

	if (erro) {

		return ERRO_TAMANHO_ARQUIVO;

	}

	long tamanho = ftell(arquivo);

	if (tamanho == ERRO_TAMANHO_ARQUIVO) {

		return -1;

	}
	erro = fseek(arquivo, 0, SEEK_SET);
	if (erro) {

		return ERRO_TAMANHO_ARQUIVO;

	}
	return tamanho;
}

char *leBufferArquivo(char *nomeArquivo) {
	FILE *arquivo = fopen(nomeArquivo, "rb");
	setvbuf(arquivo, NULL, _IONBF, 0);

	if (!arquivo) {
		fechaArquivo(arquivo);
		return NULL;
	}

	long tamanhoArquivo = medeTamanhoArquivo(arquivo);

	if (tamanhoArquivo == EXIT_FAILURE) {
		return NULL;
	}
	int tamanhoBuffer = sizeof(char) * tamanhoArquivo + 1;
	char *buffer = (char*) malloc(tamanhoBuffer);

	fread(buffer, sizeof(char), tamanhoArquivo, arquivo);

	fechaArquivo(arquivo);

	buffer[tamanhoBuffer - 1] = '\0';

	return buffer;
}

int gravaString(char *string, FILE *arquivo) {

	int quantidade = strlen(string);

	int success = fwrite(string, sizeof(char), quantidade, arquivo);

	if (success != quantidade) {
		return EXIT_FAILURE;
	}

	return EXIT_FAILURE + 1;
}

